/**
 * 单例模式
 * 懒汉模式
*/
#include <iostream>
#include <thread>
#include <mutex>


class Singleton {
public:
    ~Singleton() = default; // 默认析构
    Singleton(const Singleton &) = delete; // 不允许拷贝
    Singleton &operator=(const Singleton &) = delete; // 不允许赋值

    static Singleton *getInstance() {
        std::lock_guard<std::mutex> guard(mutex_);
        if (instance == nullptr) {
            instance = new Singleton();
        }
        return instance;
    }

    void func() {
        std::cout << "call func:" << this << std::endl;
    }

private:
    Singleton() = default; // 默认构造
    static Singleton *instance;
    static std::mutex mutex_;
};


int main() {
    // 注意在使用的时候需要声明单例的引用 Single& 才能获取对象
    Singleton *inst = Singleton::getInstance();
    inst->func();
    return 0;
}